package com.yueqian.sc.web.servlet;

import com.google.gson.Gson;
import com.mysql.jdbc.StringUtils;
import com.yueqian.sc.bean.PageBean;
import com.yueqian.sc.bean.Users;
import com.yueqian.sc.dao.IStudentDao;
import com.yueqian.sc.dao.IUserDao;
import com.yueqian.sc.dao.impl.StudentDao;
import com.yueqian.sc.dao.impl.UserDao;
import com.yueqian.sc.utils.StringTools;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 这是我们的Student对应的控制器
 */
@WebServlet("/student/*")
public class StudentServlet extends BaseServlet {
    private IStudentDao studentDao = new StudentDao();
    private IUserDao userDao = new UserDao();

    /**
     * 添加学生
     * 请求的URL：/SelectCourse2/student/add
     * 请求的方式：POST
     * 请求的类型：表单
     * 返回的类型：JSON
     *
     * @param request
     * @param response
     */
    public void add(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 创建一个Map集合存放要返回到客户端的信息
        Map<String, Object> result = new HashMap<>();
        // 1. 处理前后端的编码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 2. 获取前端表单提交的数据
        // String username = request.getParameter("username");// 这里的绿色部分尽量跟实体类属性一致
        String password = "123456";
        String nickname = request.getParameter("nickname");
        String gender = request.getParameter("gender");
        String phone = request.getParameter("phone");
        String specialty = request.getParameter("specialty");
        String grade = request.getParameter("grade");
        String pic = request.getParameter(null);
        // 3. 非空校验
        if (StringUtils.isNullOrEmpty(password) || StringUtils.isNullOrEmpty(nickname) ||
                StringUtils.isNullOrEmpty(gender) || StringUtils.isNullOrEmpty(phone) || StringUtils.isNullOrEmpty(specialty) || StringUtils.isNullOrEmpty(grade)) {
            result.put("code", -1);
            result.put("msg", "您的输入项不能为空！");
        } else {
            // 4. 访问数据库
            // 创建需要保存到数据库的数据
            // 根据数据库最新的user_id动态生成username
            String newUsername = StringTools.createUserName(userDao.getUsernameByMaxId(2), 2);
            Users student = new Users(0, newUsername, password, nickname, gender, phone, specialty,grade, pic, 0, 0);
            // 调用保存的方法
            if (studentDao.addStudent(student)) {
                System.out.println("学生添加成功！");
                result.put("code", 1);
                result.put("msg", "学生添加成功！");

            } else {
                System.out.println("学生添加失败！");
                result.put("code", 0);
                result.put("msg", "学生添加失败！");

            }
        }
        // 5. 将结果响应到前端
        response.getWriter().write(new Gson().toJson(result));
    }

    /**
     * 查询学生（支持模糊查询）
     * 请求的URL：/SelectCourse2/student/queryAll?keywords=关键字
     * 请求的方式：GET
     * 请求的类型：空
     * 返回的类型：JSON
     *
     * @param request
     * @param response
     */
    public void queryAll2(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 创建一个Map集合，封装响应到前端的信息
        Map<String, Object> result = new HashMap<>();
        // 处理前后端交互中的乱码问题
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 获取前端传过来的数据
        String keywords = request.getParameter("keywords");
        // 访问数据库
        List<Users> students = studentDao.findStudentAll(keywords);
        // 处理响应信息
        if (students != null) {
            result.put("code", 1);
            result.put("msg", "学生信息查询成功！");
            result.put("result", students);
        } else {
            result.put("code", 0);
            result.put("msg", "学生信息查询失败！");
        }
        // 将map响应到前端
        PrintWriter pw = response.getWriter();
        pw.write(new Gson().toJson(result));
    }
    /**
     * 查询学生（支持模糊查询，支持分页）
     * 请求的URL：/SelectCourse2/student/queryAll?keywords=关键字
     * 请求的方式：GET
     * 请求的类型：空
     * 返回的类型：JSON
     *
     * @param request
     * @param response
     */
    public void queryAll(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 创建一个Map集合，封装响应到前端的信息
        Map<String, Object> result = new HashMap<>();
        // 处理前后端交互中的乱码问题
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 获取前端传过来的数据
        String keywords = request.getParameter("keywords");
        // 获取前端传过来的当前页码
        String currentPage = request.getParameter("currentPage");
        // 如果没有设置当前页，默认当前页为第一页             currentPage
        if(StringUtils.isNullOrEmpty(currentPage)){
            currentPage = "1";
        }
        // 获取总条目数
        int total = studentDao.studentCount(keywords);
        // 创建pageBean，封装分页信息(总条数，每页显示的条目数，当前页)
        int pageSize = 5;
        PageBean pageBean = new PageBean(total,pageSize,Integer.parseInt(currentPage));
        // 访问数据库
        List<Users> students = studentDao.findStudentAll(keywords,pageBean.getStartIndex(),pageSize);
        // 处理响应信息
        if (students != null) {
            result.put("code", 1);
            result.put("msg", "学生信息查询成功！");
            result.put("page",pageBean);// 分页信息
            result.put("result", students);
        } else {
            result.put("code", 0);
            result.put("msg", "学生信息查询失败！");
        }
        // 将map响应到前端
        PrintWriter pw = response.getWriter();
        pw.write(new Gson().toJson(result));
    }

    /**
     * 根据编号查询学生
     * 请求的URL：/SelectCourse2/student/queryById?studentId=动态编号
     * 请求的方式：GET
     * 请求的类型：空
     * 返回的类型：JSON
     *
     * @param request
     * @param response
     * @throws IOException
     */
    public void queryById(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 创建一个Map集合，管理响应信息
        Map<String, Object> result = new HashMap<>();
        // 处理前后端交互过程中的乱码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 接收前端传递的user_id
        String studentId = !StringUtils.isNullOrEmpty(request.getParameter("studentId")) ? request.getParameter("studentId") : "0";
        // 访问数据库
        Users student = studentDao.findStudentById(Integer.parseInt(studentId));
        // 封装响应结果
        if (student != null) {
            result.put("code", 1);
            result.put("msg", "学生信息查询成功！");
            result.put("result", student);
        } else {
            result.put("code", 0);
            result.put("msg", "学生信息查询失败！");
        }
        // 将数据响应到前端
        response.getWriter().write(new Gson().toJson(result));
    }

    /**
     * 根据编号修改学生信息
     * 请求的URL：/SelectCourse2/student/update
     * 请求的方式：POST
     * 请求的类型：表单
     * 返回的类型：JSON
     *
     * @param request
     * @param response
     * @throws IOException
     */
    public void update(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 创建一个Map，用来管理响应信息
        Map<String, Object> result = new HashMap<>();
        // 对前后端交互进行编码处理
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 接收前端表单传递的信息(前端提交过来的数据都是字符串类型)
        String userId = request.getParameter("userId");// 编号
        String nickname = request.getParameter("nickname");// 姓名
        String gender = request.getParameter("gender");// 性别
        String phone = request.getParameter("phone");// 手机号
        String specialty = request.getParameter("specialty");
        String grade = request.getParameter("grade");
        String pic = request.getParameter(null);// 预备
        // 非空校验
        if (StringUtils.isNullOrEmpty(userId) || StringUtils.isNullOrEmpty(nickname) ||
                StringUtils.isNullOrEmpty(gender) || StringUtils.isNullOrEmpty(phone) || StringUtils.isNullOrEmpty(specialty)|| StringUtils.isNullOrEmpty(grade)) {
            result.put("code", -1);
            result.put("msg", "您的提交数据不能为空！");
        } else {
            // 4. 访问数据库
            // 创建需要保存到数据库的数据
            Users student = new Users(Integer.parseInt(userId), null, null, nickname, gender, phone, specialty,grade, pic, 0, 0);
            // 调用保存的方法
            if (studentDao.updateStudent(student)) {
                result.put("code", 1);
                result.put("msg", "学生修改成功！");
            } else {
                result.put("code", 0);
                result.put("msg", "学生修改失败！");

            }
        }
        // 将数据响应到前端
        response.getWriter().write(new Gson().toJson(result));
    }

    /**
     * 根据编号删除学生信息
     * 请求的URL：/SelectCourse2/student/delete?studentId=动态编号
     * 请求的方式：GET
     * 请求的类型：none
     * 返回的类型：JSON
     *
     * @param request
     * @param response
     * @throws IOException
     */
    public void delete(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 创建一个map,管理响应信息
        Map<String, Object> result = new HashMap<>();
        // 处理前后端编码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 获取前端传递的Student
        String studentId = request.getParameter("studentId");
        // 非空校验
        if (StringUtils.isNullOrEmpty(studentId)) {
            studentId = "0";
        }
        // 访问数据库
        if (studentDao.deleteStudent2(Integer.parseInt(studentId))) {
            result.put("code", 1);
            result.put("msg", "学生删除成功！");
        } else {
            result.put("code", 0);
            result.put("msg", "学生删除失败！");
        }
        // 将数据响应到前端
        response.getWriter().write(new Gson().toJson(result));

    }
}
